﻿package com._public._utils 
{
	
	/**
	 * ...2010-4-1 14:49（第三次修订）
	 * @author WZH(shch8.com)
	 * 数组处理
	 * 可直接按参数直接调用
	 * 
	 */
	public class ArrayUtil 
	{
		
		/*数组顺序找法;
		从arr数组中查找数据key, 返回数组下标;*/
		public static function orderSearch(arr:Array, key:*):int {
			arr.forEach(callback);
			var n:int;
			function callback(element:*, i:int, arr:Array):void {
				if (element == key) {
					n = i + 1;
					return;
				}
			}
			return (n > 0) ? n - 1 : -1;
		}
		/*数组二分查找法;
		从arr数组中查找数据key, 返回数组下标;*/
		public static function binarySearch(arr:Array, key:*):int{
			var low:int, mid:int, high:int;
			low = 0;
			high = arr.length - 1;
			while (low<=high){
				mid = low + (high - low) / 2;
				if(arr[mid] < key)
					low = mid + 1;
				else if(arr[mid] > key)
					high = mid - 1;
				else
					return mid;
			}
			return -1;
		}
		/*数组去除从复的,保留第一次出现的值;*/
		public static function runSingle(arr:Array):Array{
			for (var i:uint; i < arr.length-1; i++ ) {
				for (var j:uint = i+1; j < arr.length; j++ ) {
					if (arr[i] == arr[j]) {
						arr.splice(j, 1);
						i = 0;
						}
					}
				}
				return arr;
		}
		/*两个数组绝对比较是否相同*/
		public static function some(arr1:Array, arr2:Array):Boolean {
			if (arr1.length != arr2.length) return false;
			for (var i:uint; i < arr1.length; i++ ) {
				if (arr1[i] != arr2[i]) return false;
				}
				return true;
		}
		/*查看数组中最大或最小的数;
		 */
		public static function getNumSearch(arr:Array,getMax:Boolean=true):Number{
			var low:int, maxNum:Number=0,getNum:*;
			low = 0;
			while (low < arr.length) {
				getNum=Number(arr[low])
				if(getNum*0==0){//是否为数字
				if (getMax) {
					if(getNum > maxNum) {
					  maxNum=getNum
					}
				 }else {
					 if(getNum <maxNum) {
					maxNum=getNum
					 }
				   }
				}
				low++
			}
			return maxNum;
		}
		/*//数组随机排序算法;*/
		public static function arrayRandSort(targetArray:Array):Array {
			var arrayLength:Number=targetArray.length;
			//先创建一个正常顺序的数组
			var tempArray1:Array=[];
			for (var i:uint=0; i<arrayLength; i++) {
				tempArray1[i]=i;
			}
			//再根据上一个数组创建一个随机乱序的数组
			var tempArray2:Array=[];
			for (var j:uint=0; j<arrayLength; j++) {
				//从正常顺序数组中随机抽出元素
				tempArray2[j]=tempArray1.splice(Math.floor(Math.random() * tempArray1.length),1);
			}
			//最后创建一个临时数组存储 根据上一个乱序的数组从targetArray中取得数据
			var tempArray3:Array=[];
			for (var k:uint=0; k<arrayLength; k++) {
				tempArray3[k]=targetArray[tempArray2[k]];
			}
			//返回最后得出的数组
			return tempArray3;
		}
		 //在at位置刪除
        public static function deleteAt(at:uint,inputArr:Array):Array
        {
            var resultArray:Array=new Array;
            resultArray=inputArr
            resultArray.splice(at,1);
            return resultArray;
        }
		 //在at位置添加element
        public static function insertAt(element:Object,at:uint,inputArr:Array):Array
        {
            var resultArray:Array=new Array;
            resultArray=inputArr;
            resultArray.splice(at,0,element);            
            return resultArray;
        }
		//刪除指定元素element
        public static function deleteElement(element:Object,inputArr:Array):Array
        {
            var resultArray:Array=new Array;
            for(var i:uint=0;i<inputArr.length;i++)
            {
                if(inputArr[i]==element)
                {
                    inputArr.splice(i,1);
                }
            }
            resultArray=inputArr
            return resultArray;
        }
        //克隆数组
        public static function clone(inputArray:Array):Array
        {
            return inputArray.slice();
        }
        //在指定范围内产生一个序列
        public static function getSequence(low:Number,high:Number):Array
        {
            var result:Array = [];
            for (var i:uint=low; i<=high; i++) 
            {
                result.push(i);
            }
            return result;
        }
        //打乱数组顺序
        public static function shuffle(inputArray:Array):Array
        {
            var cf:Function = function ():int 
            {
                var r:int = Math.random() - 0.5;
                if (r < 0) 
                {
                    return -1;
                }
                else 
                {
                    return 1;
                }
            }    
            var resultArray:Array = clone(inputArray);
            resultArray.sort(cf);
            
            return resultArray;
        }
		
	}
	
}